Anton Lydike — Blog
Website GitHub

Debugging Memory Leaks in Python

Written: 2025-06-24
Tags: #python #snippet #debugging

I ran into a memory leak while building a program synthesis loop in Python (I know, I know...). Debugging this turns out to be a fairly pleasant experience however. The package objgraph provides all the tool needed to see which elements are dangling from where.

Here's the complete snippet:

import readline, rlcompleter, code, objgraph
print("before:")
objgraph.show_growth(limit=3)
print("\n\n")

# your code here

print("\n\nafter:")
objgraph.show_growth()

# helper to show a random graph thingy
def show_random_graph():
    refs = objgraph.find_backref_chain(
        random.choice(objgraph.by_type('MathNode')),
        objgraph.is_proper_module
    )
    objgraph.show_chain(refs)
    return refs

lvars = {**globals(), **locals()}
readline.set_completer(rlcompleter.Completer(lvars).complete)
# optional: allow global python repl history:
import os
readline.parse_and_bind("tab: complete")
readline.read_history_file(os.environ['HOME'] + '.python_history')
# this spawns the interactive console:
# here you can call show_random_graph() to see a random graph
code.InteractiveConsole(locals=lvars).interact()
readline.write_history_file(os.environ['HOME'] + '.python_history')

Make sure xdots and objgraph is installed and you're ready to go debug your thing.